(function(){

    var IsTypeOf=new Object
    {
        function isArray(arg) {
            if (Array.isArray) {
                return Array.isArray(arg);
            }
            return objectToString(arg) === '[object Array]';
        }
        IsTypeOf.isArray = isArray;

        function isBoolean(arg) {
            return typeof arg === 'boolean';
        }
        IsTypeOf.isBoolean = isBoolean;

        function isNull(arg) {
            return arg === null;
        }
        IsTypeOf.isNull = isNull;

        function isNullOrUndefined(arg) {
            return arg == null;
        }
        IsTypeOf.isNullOrUndefined = isNullOrUndefined;

        function isNumber(arg) {
            return typeof arg === 'number';
        }
        IsTypeOf.isNumber = isNumber;

        function isString(arg) {
            return typeof arg === 'string';
        }
        IsTypeOf.isString = isString;

        function isSymbol(arg) {
            return typeof arg === 'symbol';
        }
        IsTypeOf.isSymbol = isSymbol;

        function isUndefined(arg) {
            return arg === void 0;
        }
        IsTypeOf.isUndefined = isUndefined;

        function isRegExp(re) {
            return objectToString(re) === '[object RegExp]';
        }
        IsTypeOf.isRegExp = isRegExp;

        function isObject(arg) {
            return typeof arg === 'object' && arg !== null;
        }
        IsTypeOf.isObject = isObject;

        function isDate(d) {
            return objectToString(d) === '[object Date]';
        }
        IsTypeOf.isDate = isDate;

        function isError(e) {
            return (objectToString(e) === '[object Error]' || e instanceof Error);
        }
        IsTypeOf.isError = isError;

        function isFunction(arg) {
            return typeof arg === 'function';
        }
        IsTypeOf.isFunction = isFunction;

        function isPrimitive(arg) {
            return arg === null ||
                typeof arg === 'boolean' ||
                typeof arg === 'number' ||
                typeof arg === 'string' ||
                typeof arg === 'symbol' ||  // ES6 symbol
                typeof arg === 'undefined';
        }
        IsTypeOf.isPrimitive = isPrimitive;


        function objectToString(o) {
            return Object.prototype.toString.call(o);
        }
    }

    module.exports = IsTypeOf;
})();
